package com.wzw.basics.reflection;

import java.lang.reflect.Method;
import java.lang.reflect.Type;

/**
 * {@link java.lang.reflect.Method}
 *
 * 这个类用来表示java中的任何一个方法，通过这个类可以获取java中方法的任何信息，
 * 比如：方法的修饰符、方法名称、方法的参数、方法返回值、方法中声明的泛型参数列表等方法的一切信息
 *
 * @author Wangzhiwen
 */
public class MethodApi {

    public static void main(String[] args) {
        /*
         * 常用方法
         */
        Class<DemoMethod> demoMethodClass = DemoMethod.class;
        Method[] methods = demoMethodClass.getMethods();
        for (Method method : methods) {
            // 获取方法的名称
            String methodName = method.getName();

            // 返回方法的参数信息，如果参数是泛型类型的，会返回泛型的详细信息
            Type genericReturnType = method.getGenericReturnType();
            // 返回Class类型 Class是Type接口的实现
            Class<?> type = method.getReturnType();

            // Method类继承了java.lang.reflect.GenericDeclaration接口，上面这个方法是在GenericDeclaration接口中定义的，Method类中实现了这个接口，用于返回当前方法中声明的泛型变量参数列表。
            Type[] genericParameterTypes = method.getGenericParameterTypes();
            Class<?>[] parameterTypes = method.getParameterTypes();

            // 返回方法抛出的异常类型
            Type[] returnType = method.getGenericExceptionTypes();
            Class<?>[] exceptionTypes = method.getExceptionTypes();

        }
    }

}

class DemoMethod {

    public void m1(){
        System.out.println("m1");
    }

    private void m2(){
        System.out.println("m2");
    }

}

class DemoMethodExt extends DemoMethod{

    public void ext1(){
        System.out.println("ext1");
    }

    private void ext2(){
        System.out.println("ext2");
    }

}

